/*
 * Copyright (c) 2022 Huawei Device Co., Ltd.
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
import AI01weightDecoder from './AI01weightDecoder.js';
import NotFoundException from '../../../../NotFoundException.js';
import StringBuilder from '../../../../util/StringBuilder.js';
class AI013x0x1xDecoder extends AI01weightDecoder {
    constructor(information, firstAIdigits, dateCode) {
        super(information);
        this.dateCode = dateCode;
        this.firstAIdigits = firstAIdigits;
    }
    parseInformation() {
        if (this.getInformation().getSize() !== AI013x0x1xDecoder.HEADER_SIZE + AI013x0x1xDecoder.GTIN_SIZE + AI013x0x1xDecoder.WEIGHT_SIZE + AI013x0x1xDecoder.DATE_SIZE) {
            throw new NotFoundException();
        }
        let buf = new StringBuilder();
        this.encodeCompressedGtin(buf, AI013x0x1xDecoder.HEADER_SIZE);
        this.encodeCompressedWeight(buf, AI013x0x1xDecoder.HEADER_SIZE + AI013x0x1xDecoder.GTIN_SIZE, AI013x0x1xDecoder.WEIGHT_SIZE);
        this.encodeCompressedDate(buf, AI013x0x1xDecoder.HEADER_SIZE + AI013x0x1xDecoder.GTIN_SIZE + AI013x0x1xDecoder.WEIGHT_SIZE);
        return buf.toString();
    }
    encodeCompressedDate(buf, currentPos) {
        let numericDate = this.getGeneralDecoder().extractNumericValueFromBitArray(currentPos, AI013x0x1xDecoder.DATE_SIZE);
        if (numericDate === 38400) {
            return;
        }
        buf.append('(');
        buf.append(this.dateCode);
        buf.append(')');
        let day = numericDate % 32;
        numericDate = Math.trunc(numericDate / 32);
        let month = numericDate % 12 + 1;
        numericDate = Math.trunc(numericDate / 12);
        let year = numericDate;
        if (Math.trunc(year / 10) === 0) {
            buf.append('0');
        }
        buf.append(year.toString());
        if (Math.trunc(month / 10) === 0) {
            buf.append('0');
        }
        buf.append(month.toString());
        if (Math.trunc(day / 10) === 0) {
            buf.append('0');
        }
        buf.append(day.toString());
    }
    addWeightCode(buf, weight) {
        buf.append('(');
        buf.append(this.firstAIdigits);
        buf.append(Math.trunc(weight / 100000).toString());
        buf.append(')');
    }
    checkWeight(weight) {
        return weight % 100000;
    }
}
AI013x0x1xDecoder.HEADER_SIZE = 7 + 1;
AI013x0x1xDecoder.WEIGHT_SIZE = 20;
AI013x0x1xDecoder.DATE_SIZE = 16;
export default AI013x0x1xDecoder;
